package cn.dicraft.netty.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerDomainSocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;

/**
 * 服务端
 * @author 烛远
 * @date 2024/8/29 16:58
 */
public class HelloServer {
    public static void main(String[] args) {
        //1. 启动器，负责组装netty组件，启动服务器
        new ServerBootstrap()
                //2. BossEventLoop, WorkerEventGroup(selector, thread)， group组
                .group(new NioEventLoopGroup()) // accept事件，调用初始化器的init方法； 执行读事件，接收消费端给的bytebuffer
                //3. 选择服务器的 ServerSocketChannel的具体实现， NioServerSocketChannel
                .channel(NioServerSocketChannel.class) //OIO、BIO
                //4. boss负责处理连接worker(child) 负责处理读写， 决定了worker(child) 能执行哪些操作（handler）
                .childHandler(
                        //5. channel是和客户端进行数据读写的通道， initializer是负责初始化， 添加其他的handler
                        new ChannelInitializer<NioSocketChannel>() {
                    @Override //链接建立后，调用的初始化方法
                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                        // 6. 添加具体handler
                        // 解码处理， 把byteBuf转化为字符串(还原处理)
                        nioSocketChannel.pipeline().addLast(new StringDecoder()); // 按照字节管理输出
                        //自定义的handle，负责处理读事件过来之后需要做哪些处理
                        nioSocketChannel.pipeline().addLast(new ChannelInboundHandlerAdapter() {
                            @Override // 读事件
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                //打印上一次处理过的字符串
                                System.out.println(msg);
                            }
                        });
                    }
                    //6. 绑定监听端口
                }).bind(8080);
    }
}
